
#ifndef _UINT_FIFO_H_
#define _UINT_FIFO_H_


/*
 */
typedef  struct _tag_ufifo
{
    volatile uint32_t head;
    volatile uint32_t tail;
    uint32_t mask;

    /**/
    uint64_t entrys[4];
        
} ufifo_t;



/* valid data uint32 numbers */
static inline uint32_t ufifo_get_elems( ufifo_t * prb )
{
    return ( prb->head - prb->tail ) & prb->mask;
}


/* unused uint32 spaces */
static inline uint32_t ufifo_get_frees( ufifo_t * prb )
{
    return prb->mask - ( ( prb->head - prb->tail ) & prb->mask );
}


/**/
int ufifo_alloc( uint32_t npwr, ufifo_t ** pret );
int ufifo_enqueue( ufifo_t * prb, uint64_t data );
int ufifo_dequeue( ufifo_t * prb, uint64_t * pdat );



#endif
